﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Gacn.ControleAlunos.Library.DataAccess;
using Gacn.ControleAlunos.Library.Entities;

namespace Gacn.ControleAlunos.Library.Business
{
    public static class AlunoBiz
    {
        #region Get Methods
        public static TResult Get<TResult>(long id)
        {
            return Get<TResult>(id, null, null, null, null);
        }

        public static TResult Get<TResult>(long? id, long? codigo, string nome, string serie, bool? ativo)
        {
            DataTable dataTable = null;
            Type returnType = typeof(TResult);
            object objReturn = null;

            try
            {
                dataTable = AlunoDataAccess.Get(id, codigo, nome, serie, ativo);

                switch (returnType.Name)
                {
                    case "DataTable":
                        objReturn = dataTable;
                        break;

                    case "AlunoCollection`1":
                        // Retorna coleção
                        break;

                    default:
                        throw new NotSupportedException(string.Format("Tipo '{0}' não suportado.", returnType.FullName));

                }
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível resgatar informações de alunos. Contate o administrador do sistema.", ex);
            }

            return (TResult)objReturn;
        }

        public static List<AlunoEntity> GetAllAlunoEntity()
        {

            List<AlunoEntity> alunos = new List<AlunoEntity>();

            DataTable dt = AlunoDataAccess.GetAllAlunoEntity();
            foreach (DataRow row in dt.Rows)
                alunos.Add(new AlunoEntity(
                   int.Parse(row["idPessoa"].ToString()), 
                   row["NomePessoa"].ToString(),
                   int.Parse(row["idTurma"].ToString()),
                   row["CodTurma"].ToString())
                );
                
            return alunos;
        }

        public static List<AlunoEntity> GetAlunosPorNome(string nomeAluno)
        {
            List<AlunoEntity> alunos = new List<AlunoEntity>();

            DataTable dt = AlunoDataAccess.GetAlunoEntityPorNome(nomeAluno);
            foreach (DataRow row in dt.Rows)
                alunos.Add(new AlunoEntity(
                   int.Parse(row["idPessoa"].ToString()),
                   row["NomePessoa"].ToString(),
                   int.Parse(row["idTurma"].ToString()),
                   row["CodTurma"].ToString())
                );

            return alunos;
        }

        public static List<AlunoEntity> GetAlunoEntityPorID(int IDAluno)
        {
            List<AlunoEntity> alunos = new List<AlunoEntity>();

            DataTable dt = AlunoDataAccess.GetAlunoEntityPorID(IDAluno);
            foreach (DataRow row in dt.Rows)
                alunos.Add(new AlunoEntity(
                   int.Parse(row["idPessoa"].ToString()),
                   row["NomePessoa"].ToString(),
                   int.Parse(row["idTurma"].ToString()),
                   row["CodTurma"].ToString())
                );

            return alunos;
        }

        public static List<AlunoDetalhadoEntity> GetAllAlunoDetalhado()
        {
            List<AlunoDetalhadoEntity> alunos = new List<Entities.AlunoDetalhadoEntity>();

            DataTable dt = AlunoDataAccess.GetAllAlunoDetalhado();
            foreach (DataRow row in dt.Rows)
            {
                
                AlunoDetalhadoEntity aluno = new AlunoDetalhadoEntity();

                aluno.ID = (int)row["idPessoa"];

                if (row["DtNasc"] != DBNull.Value)
                    aluno.Nascimento = DateTime.Parse(row["DtNasc"].ToString());

                if (row["Sexo"] != DBNull.Value)
                    aluno.Sexo = char.Parse(row["Sexo"].ToString());

                if (row["nrSapato"] != DBNull.Value)
                    aluno.NumeroSapato = int.Parse(row["nrSapato"].ToString());

                if (row["nrFone"] != DBNull.Value)
                    aluno.Telefone = double.Parse(row["nrFone"].ToString());

                if (row["nrFone2"] != DBNull.Value)
                    aluno.Telefone2 = double.Parse(row["nrFone2"].ToString());

                if (row["nrRA"] != DBNull.Value)
                    aluno.RA = double.Parse(row["nrRA"].ToString());

                if(row["nrRoupaBaixo"] != DBNull.Value)
                    aluno.RoupaBaixo = (string)row["nrRoupaBaixo"];

                if (row["nrRoupaCima"] != DBNull.Value)
                    aluno.RoupaCima = (string)row["nrRoupaCima"];

                if (row["NomePessoa"] != DBNull.Value)
                    aluno.NomePessoa = (string)row["NomePessoa"];

                if (row["CodTurma"] != DBNull.Value)
                    aluno.TurmaCod = (string)row["CodTurma"];

                if (row["idTurma"] != DBNull.Value)
                    aluno.TurmaID = (int)row["idTurma"];

                if (row["idEscola"] != DBNull.Value)
                    aluno.EscolaID = (int)row["idEscola"];

                if (row["NomeEscola"] != DBNull.Value)
                    aluno.EscolaNome = (string)row["NomeEscola"];

                if (row["idCurso"] != DBNull.Value)
                    aluno.CursoID = (int)row["idCurso"];

                if (row["NomeCurso"] != DBNull.Value)
                    aluno.CursoNome = (string)row["NomeCurso"];

                if (row["Email"] != DBNull.Value)
                    aluno.Email = (string)row["Email"];

                if (row["obs"] != DBNull.Value)
                    aluno.Observacao = (string)row["obs"];

                if (row["aluSerie"] != DBNull.Value)
                    aluno.Serie = (string)row["aluSerie"];


                alunos.Add(aluno);
            }
            return alunos;
        }

        public static List<AlunoDetalhadoEntity> GetAllAlunoDetalhadoPorTurmaID(int TurmaID)
        {
            List<AlunoDetalhadoEntity> alunos = GetAllAlunoDetalhado();
            List<AlunoDetalhadoEntity> listaFinal = new List<AlunoDetalhadoEntity>();

            foreach (AlunoDetalhadoEntity aluno in alunos)
                if (aluno.TurmaID == TurmaID)
                    listaFinal.Add(aluno);

            return listaFinal;
        }

        public static AlunoDetalhadoEntity GetAlunoDetalhadoPorAlunoID(int AlunoID)
        {
            List<AlunoDetalhadoEntity> alunos = GetAllAlunoDetalhado();

            foreach (AlunoDetalhadoEntity aluno in alunos)
                if (aluno.ID == AlunoID)
                    return aluno;

            return null;
        }

        public static List<AlunoDetalhadoEntity> GetAllAlunoDetalhadoPorAlunoNome(string AlunoNome)
        {
            List<AlunoDetalhadoEntity> alunos = GetAllAlunoDetalhado();
            List<AlunoDetalhadoEntity> listaFinal = new List<AlunoDetalhadoEntity>();

            foreach (AlunoDetalhadoEntity aluno in alunos)
                if (aluno.NomePessoa.IndexOf(AlunoNome, StringComparison.CurrentCultureIgnoreCase) >= 0)
                    listaFinal.Add(aluno);

            return listaFinal;
        }
        #endregion

        #region Insert Methods
        public static bool MatriculaAluno(int PessoaID, int TurmaID, string Observacao, int InsertUserID)
        {
            AlunoDataAccess.CadastraMatricula(PessoaID, TurmaID, Observacao, InsertUserID);
            return true;
        }
        #endregion

        #region Update Methods
        public static void UpdateAlunoDetalhado(AlunoDetalhadoEntity aluno)
        {
            PessoaDataAccess.UpdatePessoa(aluno);
            AlunoDataAccess.UpdateMatricula((int)aluno.ID, (int)aluno.TurmaID);
        }
        #endregion
    }
}
